#include <iostream>
#include <string>
#include <vector>
using namespace std;

//实验目的：多态的应用
//实验内容：
//公司有三类雇员：老板、销售员、实习生。
//老板每月固定5000元；
//销售员每月2000元底薪加提成，提成的计算方式为销售额的10% ；
//实习生的工资按实习时间计算，每小时30元。
//现输入若干雇员的信息，请输出一个月该发多少工资。

//要求：
//首先声明类employee，包含：
//数据成员：
//string name;
//string role;
//double salary;
//以及
//构造函数：employee(string name, string role)，并且仅声明这一个构造函数，无默认构造函数。
//虚函数calcSalary
//普通成员函数showInformation（该输出雇员的姓名、角色、工资信息）
//普通成员函数getSalary（返回salary的值）
class employee
{
public:
    employee(const string& name, const string& role);
    virtual void calcSalary();
    void showInformation() const;
    double getSalary() const;
protected:
    string _name;
    string _role;
    double _salary;
};

employee::employee(const string& name, const string& role)
    :_name(name)
    ,_role(role)
    ,_salary(0)
{}

void employee::calcSalary(){}

void employee::showInformation() const
{
    cout << _name << ' ' << _role << ' ' << _salary << endl;
}

double employee::getSalary() const
{
    return _salary;
}

//再声明三个employee的派生类：boss、salesman、intern，类中需要实现虚函数calcSalary。

class boss : public employee
{
public:
    boss(string name);
    virtual void calcSalary();
};

boss::boss(string name)
    :employee(name, "boss")
{}

void boss::calcSalary()
{
    _salary = 5000;
}

class salesman : public employee
{
public:
    salesman(string name, int salesCount);
    virtual void calcSalary();
private:
    int _salesCount;
};

salesman::salesman(string name, int salesCount)
    :employee(name, "salesman")
    ,_salesCount(salesCount)
{}

void salesman::calcSalary()
{
    _salary = 2000 + _salesCount / 10.0;
}

class intern : public employee
{
public:
    intern(string name, int workHours);
    virtual void calcSalary();
private:
    int _workHours;
};

intern::intern(string name, int workHours)
    :employee(name, "intern")
    , _workHours(workHours)
{}

void intern::calcSalary()
{
    _salary = 30 * _workHours;
}

//在main函数中，
// 首先输入若干雇员的信息，放入empList中，
// 然后遍历empList，计算各雇员的工资，输出其信息，
// 最后输出总工资。
//main函数代码如下：
int main()
{
    vector<employee*> empList;
    int op, salesCount, workHours;
    string name;
    while (cin >> op)
    {
        switch (op)
        {
        case 1:
        {
            cin >> name;
            employee* pe = new boss(name);
            empList.push_back(pe);
            break;
        }
        case 2:
        {
            cin >> name >> salesCount;
            employee* pe = new salesman(name, salesCount);
            empList.push_back(pe);
            break;
        }
        case 3:
        {
            cin >> name >> workHours;
            employee* pe = new intern(name, workHours);
            empList.push_back(pe);
            break;
        }
        }
    }

    double totalSalary = 0;
    for (int i = 0; i < empList.size(); i++)
    {
        empList.at(i)->calcSalary();//先利用各派生类的多态性计算出工资
        totalSalary += empList.at(i)->getSalary();
        empList.at(i)->showInformation();
    }
    cout << "total salary:" << totalSalary << endl;
    return 0;
}
